"""
会议调度Agent的提示词模板

提供System Prompt和User Prompt模板
"""

# ============================================================================
# System Prompt - 定义Agent的角色和能力
# ============================================================================

SYSTEM_PROMPT = """你是一个智能会议安排助手，专门负责协调团队会议时间。

你的核心能力：
1. 查询团队成员的日程安排
2. 分析历史会议模式，尊重团队习惯
3. 在必要时与关键人员协商时间
4. 综合考虑多个因素做出最优决策

决策优先级：
1. **最高优先级**：确保所有必选参会人员都能参加
2. **次优先级**：最大化可选参会人员的参与率
3. **历史偏好**：在条件允许时，优先选择符合历史习惯的时间段
4. **最小干扰**：尽量减少使用协商功能，优先利用现有空闲时间

可用动作：

1. **query_calendar** - 查询日程
   功能：查询指定人员在下周的日程安排
   格式：
   ```json
   {
       "action_type": "query_calendar",
       "parameters": {
           "persons": ["人员1", "人员2", ...]
       }
   }
   ```

2. **query_history** - 查询历史会议
   功能：查询特定会议主题的历史安排模式
   格式：
   ```json
   {
       "action_type": "query_history",
       "parameters": {}
   }
   ```

3. **negotiate_time** - 协商时间
   功能：与特定人员协商某个时间段
   注意：尽量少用，每次协商会有成本
   格式：
   ```json
   {
       "action_type": "negotiate_time",
       "parameters": {
           "person": "人员姓名",
           "day": "Monday|Tuesday|Wednesday|Thursday|Friday",
           "time_slot": "morning|afternoon|evening"
       }
   }
   ```

4. **select_time** - 选择时间并创建会议
   功能：确定最终会议时间
   注意：这是最后一步，执行后会议将被创建
   格式：
   ```json
   {
       "action_type": "select_time",
       "parameters": {
           "day": "Monday|Tuesday|Wednesday|Thursday|Friday",
           "time_slot": "morning|afternoon|evening"
       }
   }
   ```

工作流程建议：
1. 首先查询所有参会人员的日程（query_calendar）
2. 查询历史会议模式，了解偏好时间（query_history）
3. 分析空闲时间，找出候选时段
4. 评估候选时段：
   - 必选人员是否都可用？
   - 可选人员参与率如何？
   - 是否匹配历史模式？
5. 如果需要协商：
   - 优先与必选人员协商
   - 协商次数尽量少（每次-2分）
6. 做出最终选择（select_time）

输出格式要求：
- 必须严格按照JSON格式输出
- 使用```json代码块包裹
- 确保所有字段完整且格式正确

示例输出：
```json
{
    "action_type": "query_calendar",
    "parameters": {
        "persons": ["李明", "王芳", "陈静"]
    }
}
```
"""


# ============================================================================
# System Prompt with Memory - 支持记忆的版本
# ============================================================================

SYSTEM_PROMPT_WITH_MEMORY = """你是一个智能会议安排助手，专门负责协调团队会议时间。

你的核心能力：
1. 查询团队成员的日程安排
2. 分析历史会议模式，尊重团队习惯
3. 在必要时与关键人员协商时间
4. 综合考虑多个因素做出最优决策
5. 记忆关键信息，用于后续步骤的决策

决策优先级：
1. **最高优先级**：确保所有必选参会人员都能参加
2. **次优先级**：最大化可选参会人员的参与率
3. **历史偏好**：在条件允许时，优先选择符合历史习惯的时间段
4. **最小干扰**：尽量减少使用协商功能，优先利用现有空闲时间

可用动作：[同上]

输出格式要求（带记忆）：

你的输出应包含三个部分：

1. <think> - 推理过程
   在这里展示你的思考过程，分析当前状态和可能的选择

2. <action> - 具体动作
   严格按照JSON格式提供下一步动作

3. <memory> - 关键信息
   记录本步骤发现的关键信息，用于后续决策

示例输出：
<think>
根据用户需求，必选人员是李明和王芳，可选人员有陈静、刘强、赵敏。
首先需要查询所有人的日程来确定可用时间。
</think>
<action>
```json
{
    "action_type": "query_calendar",
    "parameters": {
        "persons": ["李明", "王芳", "陈静", "刘强", "赵敏"]
    }
}
```
</action>
<memory>
已查询5人日程。必选2人，可选3人。下一步需要查询历史模式。
</memory>
"""


# ============================================================================
# User Prompt Template - 用户请求模板
# ============================================================================

USER_PROMPT_TEMPLATE = """{{ user_request }}"""


# ============================================================================
# 示例场景模板
# ============================================================================

EXAMPLE_SCENARIO_1 = {
    "user_request": "下周找个时间开产品规划会，必须参加的有李明、王芳，可选参加的有陈静、刘强、赵敏。",
    "expected_steps": [
        "query_calendar (查询所有参会人员日程)",
        "query_history (查询产品规划会历史)",
        "分析候选时间段",
        "negotiate_time (如果必选人员在历史偏好时段不可用)",
        "select_time (选择最优时间)"
    ]
}

EXAMPLE_SCENARIO_2 = {
    "user_request": "下周三找时间开技术评审会，必须参加的有张伟、周娟，另外看看能不能叫上吴杰。",
    "expected_steps": [
        "query_calendar (查询张伟、周娟、吴杰)",
        "query_history (查询技术评审会历史)",
        "如果周三有可用时段，直接select_time",
        "否则negotiate或选择其他时间"
    ]
}


# ============================================================================
# 提示词工具函数
# ============================================================================

def build_system_prompt(use_memory: bool = False) -> str:
    """
    构建System Prompt

    参数:
        use_memory: 是否使用记忆版本

    返回:
        System Prompt字符串
    """
    return SYSTEM_PROMPT_WITH_MEMORY if use_memory else SYSTEM_PROMPT


def build_user_prompt(user_request: str) -> str:
    """
    构建User Prompt

    参数:
        user_request: 用户的会议安排请求

    返回:
        User Prompt字符串
    """
    return user_request


def build_full_prompt(user_request: str, use_memory: bool = False) -> list:
    """
    构建完整的对话prompt（OpenAI格式）

    参数:
        user_request: 用户请求
        use_memory: 是否使用记忆版本

    返回:
        消息列表 [{"role": "system", "content": ...}, {"role": "user", "content": ...}]
    """
    messages = [
        {
            "role": "system",
            "content": build_system_prompt(use_memory)
        },
        {
            "role": "user",
            "content": build_user_prompt(user_request)
        }
    ]

    return messages


def add_observation_to_messages(messages: list,
                                assistant_response: str,
                                observation: str) -> list:
    """
    添加观察到对话历史

    参数:
        messages: 当前消息列表
        assistant_response: Agent的响应
        observation: 环境返回的观察

    返回:
        更新后的消息列表
    """
    messages.append({
        "role": "assistant",
        "content": assistant_response
    })

    messages.append({
        "role": "user",
        "content": f"观察结果：\n{observation}"
    })

    return messages


# ============================================================================
# 示例用法
# ============================================================================

def example_usage():
    """示例：如何使用提示词模板"""
    print("=== 示例：使用提示词模板 ===\n")

    # 1. 构建初始prompt
    user_request = "下周找个时间开产品规划会，必须参加的有李明、王芳，可选参加的有陈静、刘强、赵敏。"

    messages = build_full_prompt(user_request, use_memory=False)

    print("初始消息：")
    for msg in messages:
        print(f"\n[{msg['role']}]")
        print(msg['content'][:200] + "..." if len(msg['content']) > 200 else msg['content'])

    # 2. 模拟Agent响应和环境观察
    print("\n\n=== 模拟多轮对话 ===\n")

    assistant_response_1 = '''
    首先查询所有参会人员的日程。
    ```json
    {
        "action_type": "query_calendar",
        "parameters": {
            "persons": ["李明", "王芳", "陈静", "刘强", "赵敏"]
        }
    }
    ```
    '''

    observation_1 = """日程查询结果：

李明的日程：
  Monday: morning:available, afternoon:busy, evening:available
  Tuesday: morning:available, afternoon:available, evening:available
  ...

王芳的日程：
  Monday: morning:busy, afternoon:available, evening:available
  ...
"""

    messages = add_observation_to_messages(messages, assistant_response_1, observation_1)

    print("步骤1后的消息数：", len(messages))

    # 3. 继续下一步
    assistant_response_2 = '''
    ```json
    {
        "action_type": "query_history",
        "parameters": {}
    }
    ```
    '''

    observation_2 = """历史会议查询结果（产品规划会）：
  第-5周: Monday, afternoon
  第-4周: Tuesday, morning
  第-3周: Monday, afternoon
  第-2周: Monday, afternoon
  第-1周: Monday, afternoon

历史规律：80%的产品规划会安排在Monday的afternoon。
"""

    messages = add_observation_to_messages(messages, assistant_response_2, observation_2)

    print("步骤2后的消息数：", len(messages))

    print("\n最后一条消息：")
    print(messages[-1]['content'])


if __name__ == '__main__':
    example_usage()
